package com.weibo.util;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.sun.org.apache.commons.beanutils.BeanUtils;

public class UploadUtil {
	//设置上传文件的最大属性值,为3M
	private static final long MAX_SIZE = 3*1024*1024;
	////允许上传的文件格式
	private static final String[] ALLOW_TYPE = new String[]{"jpg","jpeg","gif","bmp"};
	
	@SuppressWarnings("deprecation")
	public Object getInstanceByUploadForm(HttpServletRequest request,ServletContext context,Class clazz,String filePath){
		
		Object object = null;
		
		// 创建文件处理工厂，它用于生成 FileItem 对象。
		DiskFileItemFactory factory = new DiskFileItemFactory();
		  //设置向硬盘写数据时所用的缓冲区的大小(设置最多只允许在内存中存储的数据)
		factory.setSizeThreshold(20*1024*1024);//20M
		   // 设置临时文件的存放目录(文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录)
		factory.setRepository(new File(request.getRealPath(filePath)));
		
		   //创建一个文件上传处理器
		ServletFileUpload handler = new ServletFileUpload(factory);
		//设置允许上传的文件的最大尺寸，此处为3M
		handler.setSizeMax(MAX_SIZE);
		handler.setHeaderEncoding("utf-8");
		//Map对象的键是String类型的，而值因为被定义为最上层的java对象Object对象，
		//而所有的下级对象都隶属于Object对象，所以可以传任何类型的值在里
		Map<String , Object> paramsMap = new HashMap<String, Object>();
		
		try {
			//上传文件,并解析出所有的表单字段，包括普通字段和文件字段
			List<FileItem> files = handler.parseRequest(request);
			Iterator<FileItem> it = files.iterator();
			
			object = clazz.newInstance();
			
			while(it.hasNext()){
				FileItem item = it.next();
				
				if(item.isFormField()){    //处理普通的表单域
					// 获得表单字段的属性名  getFieldName()
					//指定编码格式  getString()
					paramsMap.put(item.getFieldName(), item.getString("utf-8"));
				}else{  //处理上传文件， // 获得文件名
					 String filename = item.getName();//得到file字段的文件名全路径名
					 //防止图片重名，将图片改名
					 String format=filename.substring(filename.lastIndexOf("."));
					 String file_name=filename.substring(filename.lastIndexOf("\\")+1, filename.lastIndexOf("."));
					 Date m_date_now=new Date();
					 SimpleDateFormat timeformat=new SimpleDateFormat("yyyyMMddHHmmss",java.util.Locale.CHINA);//
					 String m_date=timeformat.format(m_date_now);
					 filename = file_name+m_date+format;
					// 写文件
					 File file = new File(filename);
					 File filetoserver = new File(context.getRealPath(filePath),file.getName());
					 item.write(filetoserver);
					 System.out.println("文件" +filetoserver.getName()+"上传成功");
					 String filetodb = request.getContextPath()+"/"+filePath+"/"+filename.substring(filename.lastIndexOf("\\")+1);
					
					 paramsMap.put(item.getFieldName(), filetodb);
				}
				  item.delete();    // 删除临时文件
			}
			BeanUtils.populate(object, paramsMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}

}
